HAL EXTI initialization and configuration functions migration

The goal of this page is to show how to migrate the Init sequence using STM32CubeMX2:

  • Open STM32CubeMX2 GPIO configuration panel.

  • Configure the SW layer HAL.

  • Configure EXTI features.

  • Generate the code.

Note

The EXTI is not limited to GPIO pins. Various internal signals and peripherals can also be routed through EXTI lines.

HAL GPIO configuration panel

Create a new project with the STM32CubeMX2, then start the initialization and the main configuration.

Project configuration panel

HAL GPIO pin selection and EXTI configuration

Configure the GPIO settings, then enable EXTI to access the EXTI configuration.

STM32CubeMX2 EXTI Configuration

The EXTI line should be selected.

EXTI pin selection

Generated EXTI initialization and de-initialization sequences

The EXTI initialization sequence is generated in the mx_gpio_default_init function in mx_gpio_default.c file under $YOUR_PROJECT_NAME$/$YOUR_PROJECT_NAME$_SW/generated/STM32Cube_CodeGen.

Related concepts:

STM32CubeMX2 Generated : EXTI initialization and de-initialization sequences

Topic

HAL1 Code Snippet

HAL2 Code Snippet

Handle declaration

GPIO_InitTypeDef   GPIO_InitStructure;
hal_gpio_config_t  gpio_config;

Initialization and configuration sequence

static void EXTI4_15_IRQHandler_Config(void)
{
    /* Enable GPIOC clock */
    __HAL_RCC_GPIOC_CLK_ENABLE();

    GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING;
    GPIO_InitStructure.Pull = GPIO_NOPULL;
    GPIO_InitStructure.Pin = GPIO_PIN_13;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);

    /* Enable and set line 4_15 Interrupt to the lowest priority */
    HAL_NVIC_SetPriority(EXTI4_15_IRQn, 2, 0);
    HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);
}
system_status_t mx_gpio_default_init(void)
{

HAL_RCC_GPIOC_EnableClock();

gpio_config.mode            = HAL_GPIO_MODE_INPUT;
gpio_config.speed           = HAL_GPIO_SPEED_FREQ_LOW;
gpio_config.pull            = HAL_GPIO_PULL_NO;
gpio_config.output_type     = HAL_GPIO_OUTPUT_PUSHPULL;
if (HAL_GPIO_Init(HAL_GPIOC, HAL_GPIO_PIN_13, &gpio_config) != HAL_OK)
{
    return SYSTEM_PERIPHERAL_ERROR;
}


gpio_config.mode            = HAL_GPIO_MODE_INPUT;
gpio_config.pull            = HAL_GPIO_PULL_NO;
if (HAL_GPIO_Init(HAL_GPIOC, HAL_GPIO_PIN_13, &gpio_config) != HAL_OK)
{
    return SYSTEM_PERIPHERAL_ERROR;
}


hal_exti_config_t exti_config;

/* Initialize and configure the EXTI for GPIOC line13 */
HAL_EXTI_Init(&hEXTI13, HAL_EXTI_LINE_13);

exti_config.trigger   = HAL_EXTI_TRIGGER_RISING;
exti_config.gpio_port = HAL_EXTI_GPIOC;

HAL_EXTI_SetConfig(&hEXTI13, &exti_config);

/* set line 13 Interrupt priority */
HAL_CORTEX_NVIC_SetPriority(EXTI13_IRQn,
                            HAL_CORTEX_NVIC_PREEMP_PRIORITY_0,
                            HAL_CORTEX_NVIC_SUB_PRIORITY_0);
HAL_CORTEX_NVIC_EnableIRQ(EXTI13_IRQn);

return SYSTEM_OK;
}

Deinitialization sequence

static void gpio_deinit(void)
{
 void HAL_GPIO_DeInit(GPIOC, GPIO_PIN_13);
}
system_status_t mx_gpio_default_deinit(void)
{
    /* De-initialize the EXTI for GPIOC line 13 */
    HAL_EXTI_DeInit(&hEXTI13);

    /* Disable line 13 Interrupt */
    HAL_CORTEX_NVIC_DisableIRQ(EXTI0_IRQn);

    HAL_GPIO_DeInit(HAL_GPIOC, HAL_GPIO_PIN_13);

    return SYSTEM_OK;
}

IRQ handle function

void EXTI13_IRQHandler(void)
{
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
}
void EXTI13_IRQHandler(void)
{
  HAL_EXTI_IRQHandler(&exti_line13_handle);
}